package framework.forms;

import org.openqa.selenium.By;

import webdriver.BaseForm;
import webdriver.controller.UserType;
import webdriver.controller.UsersController;
import webdriver.controller.UsersController.User;
import webdriver.elements.Button;
import webdriver.elements.Link;
import webdriver.elements.TextBox;

/**
 * Форма логина
 */
public class LoginForm extends BaseForm{


	private TextBox uName = new TextBox(By.name("username"), "Снилс"); //поле "Снилс"
	private TextBox uPass = new TextBox(By.name("password"), "Пароль"); // поле "Пароль"
	private Button joinBtn = new Button(By.xpath("//button[@value='Войти']"), "Войти"); // кнопка "Войти"
	private Link urFaces = new Link(By.xpath("//a[contains(.,'Юридические лица')]"), "Юридические лица"); // вкладка ЕСИА "Юридические лица"

	// поля для инициализация пользователя
	private static UsersController usersController;
	private static User user;
	private static String login;
	private static String password;

	/** Базовый конструктор.
	 */
	protected LoginForm() {
		super(By.xpath("//*[contains(@name,'username') or contains(@name,'login')]"), "Логиновая страница");
	}

	/** Заполняет форму логина
	 * @param log логин
	 * @param pass пароль
	 */
	private void fillLoginForm(final String log, final String pass){
		urFaces.click();
		uName.setText(login);
		uPass.click();
		uPass.setText(password);
		joinBtn.clickViaJsAndWait();
	}

	/** Осуществляет логин
	 * @param userIndex - порядковый номер юзера (из файла credentials.properties), под которым проходится текущий тест
	 * @return форма личного кабинета
	 */
	public final MyCabinetForm login(int userIndex){
	init(userIndex);
		if(uName.isPresent()){
			fillLoginForm(login, password);
		}else{
			SimulatorLoginForm slf = new SimulatorLoginForm();
			slf.login(login, password);
		}
		return new MyCabinetForm();
	}

	/** Инициализируем данные юзера по его номеру userIndex из файла credentials.properties
	 * @param userIndex порядковый номер юзера в векторе юзеров
	 */
	private void init(int userIndex) {
		usersController = UsersController.getInstance();
		user = usersController.getUserByIndex(UserType.USER, userIndex);
		login = user.getLogin();
		password = user.getPassword();
	}

	/** Инициализируем данные юзера по его номеру userIndex из файла credentials.properties
	 * @return login логин
	 */
	public static String getLogin(){
		return login;
	}

	/** Инициализируем данные юзера по его номеру userIndex из файла credentials.properties
	 * @return password пароль
	 */
	public static String getPasssword(){
		return password;
	}

	/** Перечень полей пользователя
	 */
	public static enum USER_DATA_ITEMS{

		// Организация, подавшая первую заявку:
		LAST_NAME("Фамилия"), FIRST_NAME("Имя"), SECOND_NAME("Отчество"), USER_FULL_NAME("ФИО пользователя"),
		USER_POSITION("Позиция пользователя"), USER_POST("Должность пользователя"), SNILS("Снилс"), ESIA_ID("ЕСИА Id"),
		EMAIL("Email"), USER_AUTHORITY("authority");

		private String val;

		/** Устанавливает название элементу перечисления
		 * @param name название
		 */
		USER_DATA_ITEMS(String name) {
			val = name;
		}
		@Override
		public String toString() {
			return val;
		}
	}

	/** Перечень полей организации
	 */
	public static enum ORG_DATA_ITEMS{

		// Организация, подавшая первую заявку:
		ORG_FULL_NAME("Полное наименование организации"),
		ORG_SHORT_NAME("Сокращенное наименование организации"), OGRN("ОГРН"), INN("ИНН"), KPP("КПП"),
		ORG_ADDRESS("Адрес организации"), ORG_OWNER("Полномочия организации");

		private String val;

		/** Устанавливает название элементу перечисления
		 * @param name название
		 */
		ORG_DATA_ITEMS(String name) {
			val = name;
		}

		@Override
		public String toString() {
			return val;
		}
	}
}
